package com.bjsxy.user;

import java.lang.reflect.Field;
import java.lang.reflect.Method;

/**setAccessible方法
 * setAccessible 是启用和禁用访问安全检查的开关.值为true则指示反射的对象在使用时应庐
 * 取消Java语言访问检查，值 false 则指示反射的对象实施Java语言访问检查*/
/*setAccessible为true 则private修饰的可以使用，
* false 则实施检测，private修饰的 不 可以使用，public修饰的可以使用*/
public class TestSetAccessible {
    public static void main(String[] args) throws  Exception{
        //Class clazz = Class.forName("com.bjsxy.user.User");
        User user = new User();
        Class clazz = user.getClass();
        Field field = clazz.getDeclaredField("name");

        //Object ob = clazz.newInstance(); 上面实例化了，不用再实例化
        //field.set(ob,"ww");
        /*field.set(user,"华");
        Object ob = field.get(user);
        System.out.println(ob);*///会报错，因为是"private"修饰，只可以读取，不可以使用

        field.setAccessible(true);//忽略安全检查
        field.set(user,"华");
        Object ob = field.get(user);
        System.out.println(ob);

        System.out.println("------------");
        Class clazz1 = Class.forName("com.bjsxy.user.UsersMethod");
        Method method = clazz1.getDeclaredMethod("eat");

        //会报错，因为是"private"修饰，只可以读取，不可以使用
       /* //实例化对象
        Object ob1 = clazz1.newInstance();
        //执行方法
        method.invoke(ob1);*/

        //忽略安全检查
        method.setAccessible(true);
        //实例化对象
        Object ob1 = clazz1.newInstance();
        //执行方法
        method.invoke(ob1);

    }
}
